package model.areas;

import model.Universidad;
import model.materiasYCatedras.Docente;
import model.materiasYCatedras.Materia;

import java.util.List;
import java.util.ArrayList;

public class Area {
	
	private String nombre;
	private Docente director;
	private List<Docente> docentesDelArea = new ArrayList<Docente>();
	private List<Materia> materiasdelarea = new ArrayList<Materia>();
	
	public Area(String nombre){
		super();
		this.nombre = nombre;
		Universidad.getInstance().agregarArea(this);
	}
	
	public Area(String nombre, Docente director){
		this(nombre);
		this.director = director;
	}
	
	public void agregarMateria(Materia materia){
		this.grabarAreaEnHistorial();
		this.materiasdelarea.add(materia);
	}
	
	/**
	 * Para poder agregar un docente al area evaluo que no este en dicha area ni en otra
	 * 
	 * @param unDocente
	 * 
	 */
	public void incorporarDocente(Docente unDocente){
		if(unDocente.getArea() == null){
			this.grabarAreaEnHistorial();
			this.getDocentesDelArea().add(unDocente);
		}
	}
	
	/**
	 * @param unDocente
	 * @param unArea
	 */
	public void cambiarDocenteDeArea(Docente unDocente, Area unArea){
		this.grabarAreaEnHistorial();
		Pase elPase = new Pase(unDocente, unDocente.getArea(), unArea);
		elPase.setEstadoDelPase(new Aprobado(unDocente, unArea));
	}
	
	public void grabarAreaEnHistorial(){
		AreaEnHistorial areaHist;
		try {
			HistorialAreaDocente.getInstance().cerrarUltimoHistorial(this);
			areaHist = new AreaEnHistorial(this.clone());
			HistorialAreaDocente.getInstance().agregarAreaEnHistorial(areaHist);
		} catch (CloneNotSupportedException e) {
			e.printStackTrace();
		}
	}
	
	@Override
	protected Area clone() throws CloneNotSupportedException {
		Area areaClon = new Area(this.getNombre());
		if(this.director != null){
			areaClon.setDirector(this.director);
		}
		areaClon.setMateriasdelarea(new ArrayList<Materia>(this.materiasdelarea));
		areaClon.setDocentesDelArea(new ArrayList<Docente>(this.docentesDelArea));
		return areaClon;
	}
	
	public boolean equals(Area obj) {
		return this.getNombre() == obj.getNombre();
	}
	
	//*********************
	// GETTERS Y SETTERS
	//*********************
	
	public String getNombre() {
		return nombre;
	}

	public void setNombre(String nombre) {
		this.nombre = nombre;
	}
	
	public Docente getDirector() {
		return director;
	}

	public void setDirector(Docente director) {
		this.director = director;
	}

	public List<Docente> getDocentesDelArea() {
		return docentesDelArea;
	}

	public void setDocentesDelArea(List<Docente> docentesDelArea) {
		this.docentesDelArea = docentesDelArea;
	}

	public List<Materia> getMateriasdelarea() {
		return materiasdelarea;
	}

	public void setMateriasdelarea(List<Materia> materiasdelarea) {
		this.materiasdelarea = materiasdelarea;
	}

}



